package ru.kreda.webapp.client.view;

import ru.kreda.webapp.client.ui.IDialogForm;

import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Window;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.TextArea;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.google.gwt.core.client.GWT;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.jhickman.web.gwt.gxtuibinder.client.GxtEvent;
import com.jhickman.web.gwt.gxtuibinder.client.GxtUiHandler;

/**
 * UI формы для диалога об ошибке.
 */
public class ErrorView extends BaseContentPanel implements IDialogForm {

	private static ErrorViewUiBinder uiBinder = GWT.create(ErrorViewUiBinder.class);

	/**
	 * Интерфейс генерации формы (см {@link UiBinder}).
	 */
	interface ErrorViewUiBinder extends UiBinder<Widget, ErrorView> {
	}

	/**
	 * Переменная формы (UiBinder): корневая панель
	 */
	@UiField
	ContentPanel contentPanel;
	/**
	 * Переменная формы (UiBinder): сообщение об ошибке
	 */
	@UiField
	Label messageLabel;
	/**
	 * Переменная формы (UiBinder): stack trace
	 */
	@UiField
	TextArea stackTracePanel;
	@UiField
	Button hideDetailsButton;
	@UiField
	Button showDetailsButton;

	private Window window;

	public ErrorView() {
		setWidget(uiBinder.createAndBindUi(this));
		contentPanel.setLayout(new FitLayout());
	}

	@Override
	public String getHeading() {
		return "Произошла ошибка";
	}

	@Override
	public void setWindow(Window window) {
		this.window = window;
		window.setSize(400, 150);
	}

	/**
	 * Установить детали ошибки
	 * 
	 * @param message
	 *            сообщение об ошибке
	 * @param userHint
	 *            подсказка пользователю
	 */
	public void setDetails(String message, String stackTrace) {
		messageLabel.setText(message);
		stackTracePanel.setValue(stackTrace);

		hideDetailsButton.setVisible(false);
		stackTracePanel.setVisible(false);

		showDetailsButton.setVisible((stackTrace != null && stackTrace.length() > 0));
	}

	@GxtUiHandler(eventType = GxtEvent.OnClick, uiField = "hideDetailsButton")
	void onHideDetailsButtonClicked(ButtonEvent event) {
		hideDetailsButton.setVisible(false);
		showDetailsButton.setVisible(true);
		stackTracePanel.setVisible(false);
		window.setSize(400, 150);
		window.center();
	}

	@GxtUiHandler(eventType = GxtEvent.OnClick, uiField = "showDetailsButton")
	void onShowDetailsButtonClicked(ButtonEvent event) {
		hideDetailsButton.setVisible(true);
		showDetailsButton.setVisible(false);
		stackTracePanel.setVisible(true);
		window.setSize(700, 700);
		window.center();
	}

}
